package vues;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import java.util.LinkedList;

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import logique.calculateur.Itineraire;
import logique.reseau.Troncon;
import logique.reseau.Ville;


public class PanelNavigation extends JPanel {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5583321036898404729L;

	// ATTRIBUTES //
	private InterfacePrincipale interfacePrincipale;
	
	private JPanel panelVuePartielleReseau;
	private JButton boutonOui;
	private JButton boutonPrecedent;
	private JButton boutonNon;
	private JButton boutonStats;
	private JButton boutonQuitter;
	private JComboBox comboVillesPossibles;
	private JLabel labelOuEtesVous;
	private JLabel labelItineraire;
	private JLabel labelProchaineEtape;
	private JLabel labelStats;
	private JLabel labelVuePartielleReseau;
	private JList listeItineraire;
	private JScrollPane scrollPaneItineraire;
	
	private Itineraire itineraire = null;
	private String nomVilleDepart;
	private boolean verbose = false;
	private Chrono chronometre;
	private boolean surLaRoute = false;
	private int currentIndex = -1;
	
	private MiniGraph miniGraph;
	
	private class Etape {
		public Etape(String ville, Date date) {
			this.ville = ville;
			this.date = date;
		}
		private String ville;
		private Date date;
	}
	LinkedList<Etape> parcours;

	protected boolean nouvelleEtape;

	private String nomVilleArrivee;
	
	// METHODS //
	public PanelNavigation(InterfacePrincipale interfacePrincipale) {
		// Enregistrement de la reference sur la fenetre principale
		this.interfacePrincipale = interfacePrincipale;
		
		// Initialisation du panel
		boutonOui = new JButton();
		boutonPrecedent = new JButton();
		boutonNon = new JButton();
		comboVillesPossibles = new JComboBox();
		labelOuEtesVous = new JLabel();
		boutonStats = new JButton();
		boutonQuitter = new JButton();
		labelItineraire = new JLabel();
		labelStats = new JLabel();
		labelProchaineEtape = new JLabel();
		panelVuePartielleReseau = new JPanel();
		labelVuePartielleReseau = new JLabel();
		scrollPaneItineraire = new JScrollPane();
		listeItineraire = new JList();
		
		
		this.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

		boutonOui.setText("Oui");
		boutonOui.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisSuiv(evt);
			}
		});

		this.add(boutonOui, new org.netbeans.lib.awtextra.AbsoluteConstraints(440, 100, -1, -1));

		boutonPrecedent.setText("Pr\u00e9c\u00e9dent");
		boutonPrecedent.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisPrec(evt);
			}
		});

		this.add(boutonPrecedent, new org.netbeans.lib.awtextra.AbsoluteConstraints(330, 100, -1, -1));

		boutonNon.setText("Non");
		boutonNon.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisPerdu(evt);
			}
		});

		this.add(boutonNon, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 100, -1, -1));
		comboVillesPossibles.setModel(new javax.swing.DefaultComboBoxModel(new String[] {}));
		this.comboVillesPossibles.setVisible(false);
		this.add(comboVillesPossibles, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 150, -1, -1));

		labelOuEtesVous.setText("O\u00f9 \u00eates vous?");
		this.labelOuEtesVous.setVisible(false);
		this.add(labelOuEtesVous, new org.netbeans.lib.awtextra.AbsoluteConstraints(330, 160, -1, -1));

		boutonStats.setText("Statistiques du parcours");
		boutonStats.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisStats(evt);
			}
		});

		this.add(boutonStats, new org.netbeans.lib.awtextra.AbsoluteConstraints(520, 420, -1, -1));

		boutonQuitter.setText("Quitter");
		boutonQuitter.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisQuitter(evt);
			}
		});

		this.add(boutonQuitter, new org.netbeans.lib.awtextra.AbsoluteConstraints(710, 420, -1, -1));
		
		this.add(labelStats, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 45, -1, -1));
		this.add(labelItineraire, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 30, -1, -1));

		labelProchaineEtape.setText("Etes vous arriv\u00e9 \u00e0 la prochaine \u00e9tape?");
		this.add(labelProchaineEtape, new org.netbeans.lib.awtextra.AbsoluteConstraints(330, 80, -1, -1));

//		panelVuePartielleReseau.setBackground(new java.awt.Color(204, 204, 255));
//		labelVuePartielleReseau.setText("Vue partielle du r\u00e9seau");
//
//		javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(panelVuePartielleReseau);
//		panelVuePartielleReseau.setLayout(jPanel13Layout);
//		jPanel13Layout.setHorizontalGroup(
//				jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
//				.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel13Layout.createSequentialGroup()
//						.addContainerGap(61, Short.MAX_VALUE)
//						.addComponent(labelVuePartielleReseau)
//						.addGap(59, 59, 59))
//		);
//		jPanel13Layout.setVerticalGroup(
//				jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
//				.addGroup(jPanel13Layout.createSequentialGroup()
//						.addGap(113, 113, 113)
//						.addComponent(labelVuePartielleReseau)
//						.addContainerGap(127, Short.MAX_VALUE))
//		);
		this.add(panelVuePartielleReseau, new org.netbeans.lib.awtextra.AbsoluteConstraints(543, 140, 250, 250));

		listeItineraire.setModel(new DefaultListModel());
		listeItineraire.addListSelectionListener(new ListSelectionListener() {

			@Override
			public void valueChanged(ListSelectionEvent e) {
				
				if (!nouvelleEtape) {
					listeItineraire.setSelectedIndex(currentIndex);
				}
				nouvelleEtape = false;
			}
			
		});
		scrollPaneItineraire.setViewportView(listeItineraire);
		
		this.add(scrollPaneItineraire, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 60, 280, 360));

	}
	
	protected void comboVillesPossiblesItemStateChanged(ItemEvent e) {
		
		DefaultListModel model = (DefaultListModel) listeItineraire.getModel();
		String villeOuEgare = new String();
		String selectedItem = (String) comboVillesPossibles.getSelectedItem();
		if (selectedItem.equals("-")) return;
		
		if (verbose) System.out.println("Nouvelle ville selectionnee: " + selectedItem);
		
		// On v�rifie que la ville qui vient d'�tre selectionn�e n'est pas cell ou on veut arriver auquel cas, on est arriv�
		if (selectedItem.equals(this.nomVilleArrivee)) {
			if (verbose) System.out.println("Arrivée!");
			
			// On vire les �tapes inter
			int indexElementSuppr = model.indexOf(listeItineraire.getSelectedValue());
			if (verbose) System.out.println("Element a suppr : " + indexElementSuppr);
			
			int tailleListe = model.getSize();
			if (verbose) System.out.println("Taille complete : " + tailleListe);
			while ((indexElementSuppr != (model.getSize())) && (model.remove(indexElementSuppr) != null)) {}
			
			// On rajoute la ville d'arriv�
			model.addElement(nomVilleArrivee);
			
			routineArrivee();
			return;
		}
		
		// TODO On lance un recalcul d'itin�raire tenant compte de l'erreur
		itineraire = this.interfacePrincipale.controleur.rectifieItineraire(this.interfacePrincipale.controleur.getVilles().get(selectedItem));
		if (itineraire == null) {
			if (verbose) System.out.println("Itineraire null");
			return;
		}
		if (verbose) System.out.println(itineraire);
		itineraire.etapeSuivante();
		
		// On supprime les villes de l'ancien itin�raire
		if (model.indexOf(listeItineraire.getSelectedValue()) == 0) {
			model.removeAllElements();
			
		} else {
			int indexElementSuppr = model.indexOf(listeItineraire.getSelectedValue()) + 2;
			currentIndex += 2;
			villeOuEgare = (String) model.get(indexElementSuppr);
			if (verbose) System.out.println("Element a suppr : " + indexElementSuppr);
			if (verbose) System.out.println("Egare en : " + villeOuEgare);
			int tailleListe = model.getSize();
			if (verbose) System.out.println("Taille complete : " + tailleListe);
			while ((indexElementSuppr != model.getSize()) && (model.remove(indexElementSuppr) != null)) {}
		}
		
		// DEBUG
		// On affiche la route associ�e au troncon
		if (verbose) System.out.println(" getObjectifCourant : " + itineraire.getObjectifCourant().getNom());
		if (verbose) System.out.println("Ajout : " + itineraire.getTronconCourant().getExtremite(itineraire.getObjectifCourant()).getNom());
		model.addElement(itineraire.getTronconCourant().getExtremite(itineraire.getObjectifCourant()).getNom());
		listeItineraire.setSelectedIndex(model.indexOf(itineraire.getTronconCourant().getExtremite(itineraire.getObjectifCourant()).getNom()));
		
		if (verbose) System.out.println("Ajout : " + " " + itineraire.getTronconCourant().getRoute().getNom());
		model.addElement(" " + itineraire.getTronconCourant().getRoute().getNom());
		
		if (verbose) System.out.println("Ajout : " + itineraire.getObjectifCourant().getNom());
		model.addElement(itineraire.getObjectifCourant().getNom());
		
		LinkedList<Troncon> troncons = itineraire.getTroncons();
		for (Troncon troncon : troncons) {
			if (troncon.equals(troncons.getFirst())) continue;
			
			if (verbose) System.out.println("Troncon:" + troncon.getVille1().getNom() +" - " + troncon.getVille2().getNom() + ", " + troncon.getRoute().getNom());
			// On ajoute la route du troncon
			model.addElement(" " + troncon.getRoute().getNom());
			
			// On ajoute la ville suivante
			String dernierAjoute = (String) model.get(model.getSize() - 2);
			if (verbose) System.out.println("dernierAjoute : " + dernierAjoute);
			if (dernierAjoute.equals(troncon.getVille1().getNom())) {
				// Si le dernier ajout� est la ville 1 du troncon alors on ajoute la ville 2 de ce dernier troncon
				model.addElement(troncon.getVille2().getNom());
			} else if (dernierAjoute.equals(troncon.getVille2().getNom())) {
				// Si le dernier ajout� est la ville 2 du troncon alors on ajoute la ville 1 de ce dernier troncon
				model.addElement(troncon.getVille1().getNom());
			} else System.out.println("Impossible de trouver la ville suivante");
			
			// On tient � jour la ville d'arriv�e
			nomVilleArrivee = (String) model.get(model.getSize() - 1);
		}
		
		// On met a jour la liste du parcours
		parcours.add(new Etape(selectedItem, new Date()));
	}

	private void routineArrivee() {
		if (verbose) System.out.println("Arrivée!");
		boutonPrecedent.setEnabled(false);
		boutonOui.setEnabled(false);
		boutonNon.setEnabled(false);

		// On met a jour les statistiques
		Date date = new Date();
		date.setTime(chronometre.getTimeDebut() + chronometre.getTime() * 1000);
		Format formatter = new SimpleDateFormat("HH:mm:ss");
		parcours.add(new Etape((String) listeItineraire.getSelectedValue(), date));
		labelStats.setText("Arrivée à destination : " + formatter.format(date));
		
		// On termine la navigation
		chronometre.stop();
		surLaRoute = false;
		this.interfacePrincipale.controleur.lockUpdates(false);
	}

	private void sourisStats(java.awt.event.MouseEvent evt) {
		String stats = new String("Statistiques détaillées\n");
		Format formatter = new SimpleDateFormat("HH:mm:ss");
		
		// On met a jour les statistiques
		for (Etape etape : parcours) {
			if (etape.ville.equals(nomVilleDepart)) {
				// Heure de d�part
				stats += "Départ de " 
					+ etape.ville 
					+ " à " 
					+ formatter.format(etape.date) 
					+ "\n";
			} else {
				// Heure d'arriv�e
				stats += "Arrivée à " 
					+ etape.ville 
					+ " à " 
					+ formatter.format(etape.date) 
					+ "\n";
			}
		}
		
		stats += "Total du parcours : " + afficheDuree(chronometre.getTimeFin() - chronometre.getTimeDebut()) + "\n";
		stats += "Nombre de villes parcourues : " + parcours.size();
		
		// TODO etc.
		
		JFrame frame = new JFrame("Statistiques");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JOptionPane.showMessageDialog(frame, stats);
	}

	public String afficheDuree(long elapsed) {
		int timeInSeconds, hours, minutes, seconds;
		timeInSeconds = (int) (elapsed/1000);
		hours = timeInSeconds / 3600;
		timeInSeconds = timeInSeconds - (hours * 3600);
		minutes = timeInSeconds / 60;

		timeInSeconds = timeInSeconds - (minutes * 60);
		seconds = timeInSeconds;
		return hours + " heure(s) " + minutes + " minute(s) " + seconds + " seconde(s)";
	}

	private void sourisQuitter(java.awt.event.MouseEvent evt) {
		System.exit(0);
	}

	private void sourisPerdu(java.awt.event.MouseEvent evt) {
		if (boutonNon.isEnabled()) {
			this.comboVillesPossibles.setVisible(true);
			this.labelOuEtesVous.setVisible(true);
		}
	}

	private void sourisPrec(java.awt.event.MouseEvent evt) {
		if (evt.getButton() == java.awt.event.MouseEvent.BUTTON1) {
			if (boutonPrecedent.isEnabled()) {
				if (this.listeItineraire.getSelectedIndex()-2 >=0){
					nouvelleEtape = true;
					currentIndex -= 2;
					this.listeItineraire.setSelectedIndex(this.listeItineraire.getSelectedIndex()-2);
					
					// On avance dans l'itin�raire
					itineraire.etapePrecedente();
					
					// TODO METTRE A JOUR LA VUE DU RESEAU
					
					// On met a jour les statistiques
					Date date = new Date();
					date.setTime(chronometre.getTimeDebut() + chronometre.getTime() * 1000);
					Format formatter = new SimpleDateFormat("HH:mm:ss");
					// TODO to test
					DefaultListModel model = (DefaultListModel) listeItineraire.getModel();
					parcours.remove(model.getElementAt(this.listeItineraire.getSelectedIndex() + 2));
					labelStats.setText("Retour à " + listeItineraire.getSelectedValue() + " à " + formatter.format(date));
				
				}
			}
		}
	}

	private void sourisSuiv(java.awt.event.MouseEvent evt) {
		if (evt.getButton() == java.awt.event.MouseEvent.BUTTON1) {
			if (boutonOui.isEnabled()) {
				// On selectionne la ville suivante dans la liste
				nouvelleEtape = true;
				currentIndex += 2;
				
				DefaultListModel model = (DefaultListModel) listeItineraire.getModel();
				this.listeItineraire.setSelectedIndex(this.listeItineraire.getSelectedIndex()+2);
				
				// On met a jour le miniGraph
				if (currentIndex != model.getSize()-1) {
					String villeCourante = (String) this.listeItineraire.getSelectedValue();
					String villeSuivante = (String) model.getElementAt(this.listeItineraire.getSelectedIndex()+2);

					if (verbose) System.out.println("GRAPHE pour " + villeCourante + ", " + villeSuivante);
					panelVuePartielleReseau.remove(miniGraph.vv);
					miniGraph = new MiniGraph(this.interfacePrincipale.controleur, 
							villeCourante, 
							villeSuivante);
					panelVuePartielleReseau.add(miniGraph.vv);
				}
				// On avance dans l'itin�raire en v�rifiant si on est bien arriv�
				if (!itineraire.etapeSuivante()) {
					// Arriv�e
					routineArrivee();

				} else {
					// On met a jour les statistiques
					Date date = new Date();
					date.setTime(chronometre.getTimeDebut() + chronometre.getTime() * 1000);
					Format formatter = new SimpleDateFormat("HH:mm:ss");
					parcours.add(new Etape((String) listeItineraire.getSelectedValue(), date));
					labelStats.setText("Arrivée à " + listeItineraire.getSelectedValue() + " à " + formatter.format(date));
				}
				
				// On est plus perdu si on a trouve la suivante
				this.comboVillesPossibles.setVisible(false);
				
				// TODO ICI METTRE A JOUR LA VUE DU RESEAU
			}
		}
	}

	public void lanceNavigation() {
		// On cr�e un itin�raire � partir des pr�f�rences enregistr�es au pr�alable
		this.itineraire = this.interfacePrincipale.controleur.calculeItineraire();
		
		if (itineraire == null) {
			System.out.println("Itinéraire non valide");
			return;
		}
		
		// On recupere les troncons de l'itin�raire et on se positionne sur le premiere trocon
		LinkedList<Troncon> troncons = itineraire.getTroncons();
		itineraire.etapeSuivante();
		
		// DEBUG Affichage de l'itin�raire
		if (verbose) {
			System.out.println("Nouvel itinéraire : ");
			System.out.println(" getDuree=" + itineraire.getDuree());
			System.out.println(" getLongueur=" + itineraire.getLongueur());
			System.out.println(" getScore=" + itineraire.getScore());
			if (itineraire.getObjectifCourant() != null)
				System.out.println(" getObjectifCourant=" + itineraire.getObjectifCourant().getNom());
			if (itineraire.getTronconCourant() != null)
				System.out.println(" getTronconCourant=" + itineraire.getTronconCourant().getLongueur());
			System.out.println(" nbTroncons=" + troncons.size());
		}
		
		
		// On remplit l'itin�raire
		DefaultListModel model = (DefaultListModel) listeItineraire.getModel();
		
		// On ajoute la ville de d�part et la suivante le premier troncon
		Ville villeSuivante = itineraire.getObjectifCourant();
		Ville villeDepart = itineraire.getTronconCourant().getExtremite(villeSuivante);
		nomVilleDepart = villeDepart.getNom();
		String nomVilleSuivante = villeSuivante.getNom();
		nomVilleArrivee = "";
		
		model.addElement(nomVilleDepart);
		comboVillesPossibles.addItem(nomVilleDepart);
		
		// On affiche la route associ�e au troncon
		model.addElement(" " + itineraire.getTronconCourant().getRoute().getNom());
		
		model.addElement(nomVilleSuivante);
		comboVillesPossibles.addItem(nomVilleSuivante);
		
		for (Troncon troncon : troncons) {
			if (troncon.equals(troncons.getFirst())) continue;
			
			// On ajoute la route du troncon
			model.addElement(" " + troncon.getRoute().getNom());
			
			// On ajoute la ville suivante
			String dernierAjoute = (String) model.get(model.getSize() - 2);
			if (dernierAjoute.equals(troncon.getVille1().getNom())) {
				// Si le dernier ajout� est la ville 1 du troncon alors on ajoute la ville 2 de ce dernier troncon
				model.addElement(troncon.getVille2().getNom());
				comboVillesPossibles.addItem(troncon.getVille2().getNom());
			} else if (dernierAjoute.equals(troncon.getVille2().getNom())) {
				// Si le dernier ajout� est la ville 2 du troncon alors on ajoute la ville 1 de ce dernier troncon
				model.addElement(troncon.getVille1().getNom());
				comboVillesPossibles.addItem(troncon.getVille1().getNom());
			} else System.out.println("Impossible de trouver la ville suivante");
			
			// On tient � jour la ville d'arriv�e
			nomVilleArrivee = (String) model.get(model.getSize() - 1);
		}
		
		// Remplir la liste des villes "je suis perdu"
		DefaultComboBoxModel comboModel = (DefaultComboBoxModel) comboVillesPossibles.getModel();
		comboVillesPossibles.addItem("-");
		Hashtable<String, Ville> villes = this.interfacePrincipale.controleur.getVilles();
		String[] c = new String[villes.size()];
		int j = 0;
		for (String key : villes.keySet()) {
			c[j] = key;
			j++;
		}
		java.util.Arrays.sort(c) ;
		for (int i=0; i<c.length; i++){
			if (comboModel.getIndexOf(c[i]) == -1)
				comboVillesPossibles.addItem(c[i]);
		}
		comboVillesPossibles.setSelectedIndex(-1);
		
		// Renomme le label itin�raire
		labelItineraire.setText("Itinéraire du parcours de " 
				+ nomVilleDepart
				+ " à " 
				+ nomVilleArrivee);
		if (verbose) System.out.println("Nouveau label : " + labelItineraire.getText());
		
		// On selectionne la premiere ville de la liste
		listeItineraire.setSelectedIndex(0);
		listeItineraire.setDragEnabled(false);
		//listeItineraire.setEnabled(false);
		
		// On ajoute le itemListener sur la combo des villes
		comboVillesPossibles.addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				comboVillesPossiblesItemStateChanged(e);
			}
			
		});
		
		// Lancement du chrono
		chronometre = new Chrono(new Date().getTime());
		chronometre.start();
		
		Date date = new Date();
		date.setTime(chronometre.getTimeDebut());
		Format formatter = new SimpleDateFormat("HH:mm:ss");
		parcours = new LinkedList<Etape>();
		parcours.add(new Etape(villeDepart.getNom(), date));
		labelStats.setText("Départ à " + formatter.format(date));
		
		// On affiche le mini graphe
		if (verbose) System.out.println("GRAPHE pour " + villeDepart.getNom() + ", " + villeSuivante.getNom());
		miniGraph = new MiniGraph(this.interfacePrincipale.controleur, villeDepart.getNom(), villeSuivante.getNom());
		panelVuePartielleReseau.add(miniGraph.vv);
		
		// On demarre la navigation aucun changement de reseau possible
		currentIndex = 0;
		surLaRoute = true;
		this.interfacePrincipale.controleur.lockUpdates(true);
	}
	
	public void interrompreNavigation() {
		// Une modification dans l'administration a interrompu la navigation
		
		// Ce nouvel itin�raire contient ls troncons a suivre depuis le point ou on est jusqu� la fin
		// On supprime les �tapes suivantes
		
		DefaultListModel model = (DefaultListModel) listeItineraire.getModel();
		String selectedItem = (String) comboVillesPossibles.getSelectedItem();
		if (selectedItem.equals("-")) return;
		
		itineraire = this.interfacePrincipale.controleur.calculeItineraire();
		if (itineraire == null) {
			if (verbose) System.out.println("Itineraire null");
			return;
		}
		if (verbose) System.out.println(itineraire);
		itineraire.etapeSuivante();
		
		// On supprime les villes de l'ancien itin�raire
		if (model.indexOf(listeItineraire.getSelectedValue()) == 0) {
			model.removeAllElements();
			
		} else {
			int indexElementSuppr = model.indexOf(listeItineraire.getSelectedValue()) + 2;
			currentIndex += 2;
			if (verbose) System.out.println("Element a suppr : " + indexElementSuppr);
			int tailleListe = model.getSize();
			if (verbose) System.out.println("Taille complete : " + tailleListe);
			while ((indexElementSuppr != model.getSize()) && (model.remove(indexElementSuppr) != null)) {}
		}
		
		// On ajoute la route associ�e la ville cible, la route du troncon, la 
		if (verbose) System.out.println(" getObjectifCourant : " + itineraire.getObjectifCourant().getNom());
		if (verbose) System.out.println("Ajout : " + itineraire.getTronconCourant().getExtremite(itineraire.getObjectifCourant()).getNom());
		model.addElement(itineraire.getTronconCourant().getExtremite(itineraire.getObjectifCourant()).getNom());
		listeItineraire.setSelectedIndex(model.indexOf(itineraire.getTronconCourant().getExtremite(itineraire.getObjectifCourant()).getNom()));
		
		if (verbose) System.out.println("Ajout : " + " " + itineraire.getTronconCourant().getRoute().getNom());
		model.addElement(" " + itineraire.getTronconCourant().getRoute().getNom());
		
		if (verbose) System.out.println("Ajout : " + itineraire.getObjectifCourant().getNom());
		model.addElement(itineraire.getObjectifCourant().getNom());
		
		LinkedList<Troncon> troncons = itineraire.getTroncons();
		for (Troncon troncon : troncons) {
			if (troncon.equals(troncons.getFirst())) continue;
			
			if (verbose) System.out.println("Troncon:" + troncon.getVille1().getNom() +" - " + troncon.getVille2().getNom() + ", " + troncon.getRoute().getNom());
			// On ajoute la route du troncon
			model.addElement(" " + troncon.getRoute().getNom());
			
			// On ajoute la ville suivante
			String dernierAjoute = (String) model.get(model.getSize() - 2);
			if (verbose) System.out.println("dernierAjoute : " + dernierAjoute);
			if (dernierAjoute.equals(troncon.getVille1().getNom())) {
				// Si le dernier ajout� est la ville 1 du troncon alors on ajoute la ville 2 de ce dernier troncon
				model.addElement(troncon.getVille2().getNom());
			} else if (dernierAjoute.equals(troncon.getVille2().getNom())) {
				// Si le dernier ajout� est la ville 2 du troncon alors on ajoute la ville 1 de ce dernier troncon
				model.addElement(troncon.getVille1().getNom());
			} else System.out.println("Impossible de trouver la ville suivante");
			
			// On tient � jour la ville d'arriv�e
			nomVilleArrivee = (String) model.get(model.getSize() - 1);
		}
	}

	public class Chrono implements Runnable {  
		  private Thread chronometre;
		  private long timeDebut;
		  private long timeFin;
		  private long time = 0;
		  private boolean chronoContinue = false;
		  
		  public Chrono(long debut) {
			  this.timeDebut = debut;
		  }
		  
		  public long getTime() {
		    	return this.time;
		  }
		  
		  public long getTimeDebut() {
		    	return this.timeDebut;
		  }
		  
		  public long getTimeFin() {
		    	return this.timeFin;
		  }
		  
		  public Thread getThreadChrono() {
		      return this.chronometre;
		  }
		  
		  // M�thode appel�e par le syst�me au d�marrage du chrono
		  public void start() {
		      // cr�ation et d�marrage du chronom�tre
		      if (chronoContinue == false) { // pour �viter de d�marrer 2 fois le chrono
		          chronoContinue = true;
		          chronometre = new Thread(this);
		          chronometre.start();
		      }
		  }
		  
		  // M�thode utilis�e pour arr�ter le chrono
		  public void stop() {
		      if (chronometre != null) {
		    	  timeFin = timeDebut + time * 1000;
		          chronoContinue = false;
		      }
		      
		  }
		    
		  public void run () {
		      try {
		          while ((chronoContinue)) { 
		              // Augmente d'une seconde
		        	  time++;
		              if (time == 10000000) {
		                  System.out.println("temps max");
		                  this.stop();
		              }
		              
		              // Arr�te le thread pendant une seconde
		              Thread.sleep (1000);
		              
		          }
		      }
		      catch (InterruptedException e) { }
		  }
	}

	public boolean isSurLaRoute() {
		return surLaRoute;
	}

}
